package cn.com.cifi.mars.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 数学 工具类
 *
 * @author panglx
 * @date 2019/6/26
 */
public class MathUtils {

    public static final BigDecimal NUM_10000 = new BigDecimal("10000");

    public static final BigDecimal NUM_100 = new BigDecimal("100");

    public static final String QIAN_FEN_WEI_LONG_PATTERN = "%1$,d";

    public static final String QIAN_FEN_WEI_DOUBLE_PATTERN = "%1$,.2f";

    public static String toQFW(String num){
        if (num.contains(".")){
            return String.format(QIAN_FEN_WEI_DOUBLE_PATTERN,Double.valueOf(num));
        }
        return String.format(QIAN_FEN_WEI_LONG_PATTERN,Long.valueOf(num));
    }


    /**
     * 新 BigDecimal 对象，非数值字符串按0处理
     *
     * @param str
     * @return
     */
    public static BigDecimal newBigDecimal(String str) {
        try {
            return new BigDecimal(str);
        } catch (Exception e) {
            return new BigDecimal("0");
        }
    }

    /**
     * 字符串数值相加，非数值字符串按0处理
     *
     * @param a
     * @param b
     * @return
     */
    public static BigDecimal bigDecimalAdd(String a, String b) {

        return newBigDecimal(a).add(newBigDecimal(b));
    }

    /**
     * 相加，null按0处理
     * @return
     */
    public static BigDecimal bigDecimalAdd(BigDecimal... num) {
        BigDecimal result = BigDecimal.ZERO;
        for (BigDecimal bigDecimal:num){
            result = result.add(nullDefaultZero(bigDecimal));
        }
        return result;
    }


    /**
     * 如果参数为null则返回值为0的BigDecimal对象
     *
     * @param bigDecimal
     * @return
     */
    public static BigDecimal nullDefaultZero(BigDecimal bigDecimal) {
        return bigDecimal == null ? BigDecimal.ZERO : bigDecimal;
    }

    /**
     * 是否为 0
     *
     * @param bigDecimal
     * @return
     */
    public static boolean isZero(BigDecimal bigDecimal) {
        return bigDecimal == null ? true : bigDecimal.compareTo(BigDecimal.ZERO) == 0;
    }

    /**
     * 是否不为 0
     *
     * @param bigDecimal
     * @return
     */
    public static boolean isNotZero(BigDecimal bigDecimal) {
        return !isZero(bigDecimal);
    }

    /**
     * 是否都不为 0
     *
     * @param objects
     * @return
     */
    public static boolean isNoneZero(Object... objects) {
        if (objects == null) {
            return false;
        }
        for (Object object : objects) {
            if (object == null){
                return false;
            }
            if (object instanceof BigDecimal){
                if (isZero((BigDecimal) object)){
                    return false;
                }
                continue;
            }
            if (object instanceof Integer){
                if (0 == (Integer) object){
                    return false;
                }
                continue;
            }
            if (object instanceof Long){
                if (0 == (Long) object){
                    return false;
                }
                continue;
            }
            if (object instanceof Double){
                if (0 == (Double) object){
                    return false;
                }
                continue;
            }
            //按需扩展..
        }
        return true;
    }

    /**
     * 是否存在任意一个不为 0
     *
     * @param bigDecimal
     * @return
     */
    public static boolean existNotZero(BigDecimal... bigDecimal) {
        if (bigDecimal == null) {
            return false;
        }
        for (BigDecimal n : bigDecimal) {
            if (isNotZero(n)) {
                return true;
            }
        }
        return false;
    }

    public static Integer integerAdd(Integer... vals){
        int r = 0;
        for (int i=0;i<vals.length;i++){
            r += vals[i]==null?0:vals[i];
        }
        return r;
    }

    public static BigDecimal integerDiv(Integer a, Integer b, int scale, RoundingMode roundingMode){
        return new BigDecimal(a == null?0:a).divide(new BigDecimal(b),scale,roundingMode);
    }

    public static int compare(Integer a, Integer b) {
        if (a == null) {
            a = 0;
        }
        if (b == null) {
            b = 0;
        }
        return a - b;
    }

    public static BigDecimal avg(BigDecimal... bigDecimals){
        if (bigDecimals.length == 0){
            return BigDecimal.ZERO;
        }
        return bigDecimalAdd(bigDecimals).divide(new BigDecimal(bigDecimals.length),2,RoundingMode.HALF_UP);
    }

    /**
     * 是否数值，包括：整数和小数
     * @param number
     * @return
     */
    public static boolean isNumber(String number){
       return StrUtils.isNumber(number);
    }
    
    public static String strSubtract(String v1,String v2) {
		String result = "";
		if(StrUtils.isNotEmpty(v1) && StrUtils.isNotEmpty(v2)) {
			BigDecimal b1 = new BigDecimal(v1);
			BigDecimal b2 = new BigDecimal(v2);
			result = b1.subtract(b2).toString();
		}
		return result;
	}
    
    public static String decimalFormat(String value) {
    	if(StrUtils.isEmpty(value)) {
    		return "";
    	}
    	DecimalFormat df = new DecimalFormat("0.00%");
    	return df.format(Double.valueOf(value).doubleValue());
    }
    
    public static String roundNum(String value) {
    	if(StrUtils.isEmpty(value)) {
    		return "";
    	}
    	return String.valueOf(Math.round(Double.valueOf(value).doubleValue()));
    }
    
    public static String formatWan(BigDecimal value) {
    	if(value == null) {
    		return "";
    	}
		return value.divide(NUM_10000, 0, BigDecimal.ROUND_HALF_UP).toString();
    }

}
